package com.bbva.gptf.back.servicio.simulacion;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import com.bbva.gptf.dto.bean.ColumnaVista;
import com.bbva.gptf.dto.bean.GrupoDelta;
import com.bbva.gptf.dto.bean.InstrumentosSimulacion;
import com.bbva.gptf.dto.bean.Integracion;
import com.bbva.gptf.dto.bean.ListaContrato;
import com.bbva.gptf.dto.bean.PlazoSimulacion;
import com.bbva.gptf.dto.bean.ReporteSimulacion;
import com.bbva.gptf.dto.bean.Simulacion;
import com.bbva.gptf.dto.bean.TipoPosicion;
import com.bbva.gptf.dto.bean.Usuario;
import com.bbva.gptf.dto.bean.Validacion;
import com.bbva.gptf.dto.servicio.personalizar.ServicioConfiVista;
import com.bbva.gptf.dto.servicio.personalizar.ServicioListaContrato;
import com.bbva.gptf.dto.servicio.posicion.ServicioGrupoDelta;
import com.bbva.gptf.dto.servicio.simulacion.ServicioSimulacion;
import com.bbva.gptf.dto.servicio.simulacion.ServicioSimulacionFacade;
import com.bbva.jee.arq.spring.core.httpService.HttpService;

/**
 * Servicio que gestiona las operaciones que provienen de ControladorSimulacion.
 * 
 * @author jcompean
 * @version 1.0
 * @created Feb 2, 2013 11:42:56 AM
 */
@HttpService(serviceName = "servicioSimulacionFacadeHttp")
public class ServicioSimulacionFacadeImpl implements ServicioSimulacionFacade {

	// private final Logger log =
	// LoggerFactory.getLogger(ServicioSimulacionFacadeImpl.class);

	@Autowired
	private ServicioListaContrato servicioListaContrato;

	@Autowired
	private ServicioGrupoDelta servicioGrupoDelta;

	@Autowired
	private ServicioSimulacion servicioSimulacion;

	@Autowired
	private ServicioConfiVista servicioConfiVista;

	@Override
	public boolean generarOrdenes(
			final List<InstrumentosSimulacion> listaPosiciones,
			final boolean restricciones, final BigDecimal cdGestor,
			final String cdUsuarioUmo) {
		return servicioSimulacion.generarOrdenes(listaPosiciones,
				restricciones, cdGestor, cdUsuarioUmo);
	}

	@Override
	public boolean generarOrdenesLayout(final List<InstrumentosSimulacion> listaOrdenes,
			final BigDecimal cdGestor, final String cdUsuarioUmo) {
		return servicioSimulacion.generarOrdenesLayout(listaOrdenes, cdGestor, cdUsuarioUmo);
	}

	@Override
	public List<InstrumentosSimulacion> integrar(
			List<InstrumentosSimulacion> listaPosicion,
			List<Integracion> listaIntegracion,
			String tipoOperacion, Long tipoConsulta,
			String tipoMercado) {
		return servicioSimulacion.integrar(listaPosicion, listaIntegracion,
				tipoOperacion, tipoConsulta, tipoMercado);
	}

	@Override
	public List<ReporteSimulacion> obtenerReporteSimulacion(
			final Simulacion simulacion) {
		// TODO Auto-generated method stub
		final List<ReporteSimulacion> reporSimulacion = new ArrayList<ReporteSimulacion>();
		final List<InstrumentosSimulacion> listaInstrumentosSimulacion = simulacion
				.getListaPosicionSimulacion();
		if (listaInstrumentosSimulacion != null) {
			for (final InstrumentosSimulacion instrSim : listaInstrumentosSimulacion) {
				final ReporteSimulacion reporte = new ReporteSimulacion();
				reporte.setNbClasificacion(valida(instrSim.getNbClasificacion()));
				reporte.setTpContrato(valida(instrSim.getTpContrato()));
				reporte.setImCaMonto(instrSim.getImCaMonto() != null ? instrSim.getImCaMonto().
						toPlainString() : null);
				reporte.setPcCaIntegracion(instrSim.getPcCaIntegracion() != null ? instrSim.
						getPcCaIntegracion().toPlainString() : null);
				reporte.setNuCaDelta(instrSim.getNuCaDelta() != null ? instrSim.getNuCaDelta().toPlainString() : null);
				reporte.setNuCaContribucion(instrSim.getNuCaContribucion() != null ? instrSim.
						getNuCaContribucion().toPlainString() : null);
				reporte.setNuCaTasa(instrSim.getNuCaTasa() != null ? instrSim
						.getNuCaTasa().toPlainString() : null);
				reporte.setImCaPrecio(instrSim.getImCaPrecio() != null ? instrSim
						.getImCaPrecio().toPlainString() : null);
				reporte.setCtCaTitulo(instrSim.getCtCaTitulo() != null ? instrSim.
						getCtCaTitulo().toString() : null);
				reporte.setImCaLiquidez(instrSim.getImCaLiquidez() != null ? instrSim.
						getImCaLiquidez().toPlainString() : null);
				reporte.setImCaValCartera(instrSim.getImCaValCartera() != null ? instrSim.
						getImCaValCartera().toPlainString() : null);
				reporte.setPcCaBenchmark(instrSim.getPcCaBenchmark() != null ? instrSim
						.getPcCaBenchmark().toPlainString() : null);
				reporte.setPcCaConbenchmark(instrSim.getPcCaConbenchmark() != null ? instrSim
						.getPcCaConbenchmark().toPlainString() : null);
				reporte.setPcCaDifintegra(instrSim.getPcCaDifintegra() != null ? instrSim
						.getPcCaDifintegra().toPlainString() : null);
				reporte.setNuCaPonderacion(instrSim.getNuCaPonderacion() != null ? instrSim
						.getNuCaPonderacion().toPlainString() : null);
				reporte.setCtCfTitulo(instrSim.getCtCfTitulo() != null ? instrSim.
						getCtCfTitulo().toString() : null);
				reporte.setImCfPrecio(instrSim.getImCfPrecio() != null ? instrSim
						.getImCfPrecio().toPlainString() : null);
				reporte.setImCfMonto(instrSim.getImCfMonto() != null ? instrSim.
						getImCfMonto().toPlainString() : null);
				reporte.setImCfLiquidez(instrSim.getImCfLiquidez() != null ? instrSim.
						getImCfLiquidez().toPlainString() : null);
				reporte.setPcCfIntegracion(instrSim.getPcCfIntegracion() != null ? instrSim
						.getPcCfIntegracion().toPlainString() : null);
				reporte.setNuCfDelta(instrSim.getNuCfDelta() != null ? instrSim
						.getNuCfDelta().toPlainString() : null);
				reporte.setNuCfContribucion(instrSim.getNuCfContribucion() != null ? instrSim
						.getNuCfContribucion().toPlainString() : null);
				reporte.setNuCfTasa(instrSim.getNuCfTasa() != null ? instrSim
						.getNuCfTasa().toPlainString() : null);
				reporte.setImCfValCartera(instrSim.getImCfValCartera() != null ? instrSim.
						getImCfValCartera().toPlainString() : null);
				reporte.setPcCfBenchmark(instrSim.getPcCfBenchmark() != null ? instrSim
						.getPcCfBenchmark().toPlainString() : null);
				reporte.setPcCfConbenchmark(instrSim.getPcCfConbenchmark() != null ? instrSim
						.getPcCfConbenchmark().toPlainString() : null);
				reporte.setPcCfDifintegra(instrSim.getPcCfDifintegra() != null ? instrSim
						.getPcCfDifintegra().toPlainString() : null);
				reporte.setNuCfPonderacion(instrSim.getNuCfPonderacion() != null ? instrSim
						.getNuCfPonderacion().toPlainString() : null);
				if (instrSim.getImValorNominal() != null && instrSim.getImValorNominal().compareTo(BigDecimal.ZERO) != 0) {
					reporte.setImCfMontoOperar(instrSim.getImMontoNominal() != null ? instrSim
							.getImMontoNominal().toPlainString() : null);
				}
				if (instrSim.getImValorNominal() != null && instrSim.getImValorNominal().compareTo(BigDecimal.ZERO) == 0) {
					reporte.setImCfMontoOperar(instrSim.getImCfMontoOperar() != null ? instrSim
							.getImCfMontoOperar().toPlainString() : null);
				}
				reporte.setInstrumento(instrSim.getCdValorBmv() != null
						&& instrSim.getCdEmisora() != null
						&& instrSim.getCdSerie() != null ? instrSim
						.getCdValorBmv()
						+ "_"
						+ instrSim.getCdEmisora()
						+ "_"
						+ instrSim.getCdSerie() : "");
				reporte.setNivel(valida(instrSim.getTpNivel().toString()));
//				reporte.setTitulosOperar(instrSim.getTitulosOperar() != null ? instrSim
//						.getTitulosOperar() : null);
				reporte.setPorcentajeOperar(instrSim.getPorcentajeOperar() != null ? instrSim
						.getPorcentajeOperar().toPlainString() : null);
				
				reporSimulacion.add(reporte);
			}
		}
		return reporSimulacion;
	}

	@Override
	public Simulacion obtieneDatosUsuario(final Usuario usuario) {
		final Simulacion simulacion = new Simulacion();
		String cdBancomerMancuerna = "";
		BigDecimal cdUsuarioBancomer = null;
		simulacion.setTipoBusqueda("GD");
		simulacion.setTipoMercado("DIN");
		
		if (!usuario.getPerfil().getMercado().getCdMercado()
				.equals(BigDecimal.ONE)) {
			simulacion.setTipoMercado("CAP");
		}
		if (usuario.getGestor().getMancuerna() != null) {
			cdBancomerMancuerna = usuario.getGestor().getMancuerna()
					.getCdBancomer();
			cdUsuarioBancomer = usuario.getGestor().getMancuerna()
					.getCdUsuario();
			simulacion.setCdMancuerna(cdBancomerMancuerna);
		}
		simulacion.setCdBancomer(usuario.getCdBancomer());
		simulacion.setCdUsuario(usuario.getCdUsuario());
		List<GrupoDelta> listaGrupoDelta = new ArrayList<GrupoDelta>();
		List<ListaContrato> listaContratos = new ArrayList<ListaContrato>();
		if (usuario.getPerfil().getCdPerfil().intValue() == 5
				|| usuario.getPerfil().getCdPerfil().intValue() == 6) {
			listaGrupoDelta = servicioGrupoDelta
				.obtieneGrupoDeltasPorTipoMercado(usuario.getPerfil().getMercado().getCdMercado(), false, false);
			listaContratos = servicioListaContrato
				.obtenerListaContrato(usuario.getCdUsuario());
		} else {
			listaGrupoDelta = servicioGrupoDelta
					.obtieneGrupoDeltasPorGestor(usuario.getCdBancomer(),
							cdBancomerMancuerna, false, false);
			//
			listaContratos = servicioListaContrato
					.obtenerListaContrato(usuario.getCdUsuario());
			if (cdUsuarioBancomer != null) {
				listaContratos.addAll(servicioListaContrato
						.obtenerListaContrato(cdUsuarioBancomer));
			}
		}
		
		for (int i = 0; i < listaGrupoDelta.size(); i++) {
			if (listaGrupoDelta.get(i).getCdGrupoDelta()
					.compareTo(BigDecimal.ZERO) == 0) {
				listaGrupoDelta.remove(i);
				break;
			}
		}
		//
		simulacion.setListaGrupoDelta(listaGrupoDelta);
		simulacion.setListaContratos(listaContratos);

		final List<TipoPosicion> listaTipoPosicion = new ArrayList<TipoPosicion>();
		TipoPosicion tp = new TipoPosicion();
		tp.setValor(BigDecimal.valueOf(4L));
		tp.setDescripcion("GRUPO");
		listaTipoPosicion.add(tp);
		tp = new TipoPosicion();
		tp.setValor(BigDecimal.valueOf(5L));
		tp.setDescripcion("INSTRUMENTO");
		listaTipoPosicion.add(tp);
		tp = new TipoPosicion();
		tp.setValor(BigDecimal.valueOf(6L));
		tp.setDescripcion("CARTERA");
		listaTipoPosicion.add(tp);
		simulacion.setTipoPosicion(4L);// GRUPO
		simulacion.setListaTipoPosicion(listaTipoPosicion);
		return simulacion;
	}

	@Override
	public List<Integracion> obtieneInstrumentos(final String tipoMercado,
			final String tipoValor, final String emisora, final String serie,
			final Integer plazoMin, final Integer plazoMax) {
		return servicioSimulacion.obtieneInstrumentos(
				tipoMercado.equals("CAP") ? "MC" : "MD", tipoValor, emisora,
				serie, plazoMin, plazoMax);
	}

	@Override
	public List<Integracion> obtieneMontos(
			final List<InstrumentosSimulacion> listaPosicion,
			final List<Integracion> listaIntegracion, final String tipoOperacion) {
		return servicioSimulacion.obtieneMontos(listaPosicion,
				listaIntegracion, tipoOperacion);
	}

	@Override
	public List<PlazoSimulacion> obtienePlazos(final String tipoValor,
			final String emisora) {
		return servicioSimulacion.obtienePlazos(tipoValor, emisora);
	}

	@Override
	public List<InstrumentosSimulacion> obtienePosicion(
			final List<InstrumentosSimulacion> lista, final String tipoMercado,
			final String tipoBusqueda, final BigDecimal valor,
			final Long tipoPosicion, final String cdBancomer) {
		final List<InstrumentosSimulacion> listaPosicion = servicioSimulacion
				.obtienePosicion(lista, tipoMercado, tipoBusqueda, valor,
						tipoPosicion, cdBancomer);
		return listaPosicion;
	}

	@Override
	public List<Validacion> obtieneRestricciones(List<InstrumentosSimulacion> listaPosiciones,
			String tipoMercado) {
		return servicioSimulacion.obtieneRestricciones(listaPosiciones, tipoMercado);
	}

	@Override
	public List<InstrumentosSimulacion> recalculo(
			final List<InstrumentosSimulacion> listaPosicion,
			final Long tipoPosicion, final Boolean titulosOperar) {
		return servicioSimulacion.recalculo(listaPosicion, tipoPosicion, titulosOperar);
	}

	@Override
	public List<ColumnaVista> obtenerConfiVista(BigDecimal cdUsuario, BigDecimal cdVista) {
		return servicioConfiVista.obtenerConfiVista(cdUsuario, cdVista);
	}

	public void setServicioGrupoDelta(
			final ServicioGrupoDelta servicioGrupoDelta) {
		this.servicioGrupoDelta = servicioGrupoDelta;
	}

	public void setServicioListaContrato(
			final ServicioListaContrato servicioListaContrato) {
		this.servicioListaContrato = servicioListaContrato;
	}

	public void setServicioSimulacion(
			final ServicioSimulacion servicioSimulacion) {
		this.servicioSimulacion = servicioSimulacion;
	}
	
	public void setServicioConfiVista(ServicioConfiVista servicioConfiVista) {
		this.servicioConfiVista = servicioConfiVista;
	}

	public String valida(final BigDecimal val) {
		return val != null ? val.toString() : "";
	}

	public String valida(final String val) {
		return StringUtils.isBlank(val) ? "" : val;
	}

}
